package wh.coach.pivot3.table.dynamic;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.List;

public class DataTable {
    public DataTable() {
        this.columns = new ArrayList<>();
        this.rows = new ArrayList<>();
    }

    private final List<String> columns;
    private final List<DataRow> rows;

    //获取数据列的数量
    public int getRowCount() {
        return rows.size();
    }

    //根据索引获取一行数据
    public DataRow getRow(int rowIndex) {
        if (rowIndex >= 0 && rowIndex < rows.size()) {
            return rows.get(rowIndex);
        }
        return null;
    }

    //获取所有的列名（属性列）
    public List<String> getColumns() {
        //提供不可修改的视图
        return Collections.unmodifiableList(columns);
    }

    //获取所有的行数据
    public List<DataRow> getRows() {
        return new ArrayList<>(rows);
    }

    //添加列名
    public void addColumns(String[] columns) {
        this.columns.addAll(List.of(columns));
    }

    //添加一列数据(接受数组类型)
    public void addRow(String[] values) {
        MapRow row = createMapRow(values);
        rows.add(row);
    }

    public void addRow(Collection<String> values) {
        MapRow row = createMapRow(values.toArray(new String[0]));
        rows.add(row);
    }

    private MapRow createMapRow(String[] values) {
        //验证非空并且长度相等
        if (columns.isEmpty()) {
            throw new IllegalStateException("列不能为空");
        }
        if (values.length > columns.size()) {
            throw new IllegalStateException("values的长度不能大于columns的长度");
        }
        MapRow row = new MapRow();
        for (int i = 0; i < values.length; i++) {
            row.setValue(columns.get(i), values[i]);
        }
        return row;
    }

    //根据数据删除一行数据
    public boolean removeRow(DataRow row) {
        return rows.remove(row);
    }

    //根据索引删除一行数据
    public boolean removeRow(int rowIndex) {
        if (rowIndex >= 0 && rowIndex < rows.size()) {
            rows.remove(rowIndex);
            return true;
        }
        return false;
    }
    public DataGroups groupBy(List<String> rowKeys,List<String> columnKeys){
        DataGroups groups = new DataGroups(rowKeys, columnKeys);

        for (DataRow row : rows) {
            groups.addDataRow(row);
        }

        return groups;
    }
}
